function Jacobian = calculate_Jacobian(dtheta, DH_para, q)

Alpha = DH_para.Alpha;
A = DH_para.A;
D = DH_para.D;
Theta = DH_para.Theta + dtheta;

a3 = A(3); a4 = A(4);
d1 = D(1); d4 = D(4); d5 = D(5); d6 = D(6);
q1 = q(1) + dtheta(1); q2 = q(2) + dtheta(2); q3 = q(3) + dtheta(3); q4 = q(4) + dtheta(4); q5 = q(5) + dtheta(5); q6 = q(6) + dtheta(6);

Jacobian = [ d6*cos(q2 + q3 + q4)*sin(q1)*sin(q5) - a4*sin(q2 + q3)*sin(q1) - d6*cos(q1)*cos(q5) - a3*sin(q1)*sin(q2) - d5*sin(q2 + q3 + q4)*sin(q1) - d4*cos(q1),                        cos(q1)*(a4*cos(q2 + q3) + a3*cos(q2) + d5*cos(q2 + q3 + q4) + d6*sin(q2 + q3 + q4)*sin(q5)),                        cos(q1)*(a4*cos(q2 + q3) + d5*cos(q2 + q3 + q4) + d6*sin(q2 + q3 + q4)*sin(q5)),                        cos(q1)*(d5*cos(q2 + q3 + q4) + d6*sin(q2 + q3 + q4)*sin(q5)),  d6*(sin(q1)*sin(q5) - cos(q2 + q3 + q4)*cos(q1)*cos(q5)), 0;
   a4*sin(q2 + q3)*cos(q1) - d4*sin(q1) - d6*(cos(q5)*sin(q1) + cos(q2 + q3 + q4)*cos(q1)*sin(q5)) + a3*cos(q1)*sin(q2) + d5*sin(q2 + q3 + q4)*cos(q1),                        sin(q1)*(a4*cos(q2 + q3) + a3*cos(q2) + d5*cos(q2 + q3 + q4) + d6*sin(q2 + q3 + q4)*sin(q5)),                        sin(q1)*(a4*cos(q2 + q3) + d5*cos(q2 + q3 + q4) + d6*sin(q2 + q3 + q4)*sin(q5)),                        sin(q1)*(d5*cos(q2 + q3 + q4) + d6*sin(q2 + q3 + q4)*sin(q5)), -d6*(cos(q1)*sin(q5) + cos(q2 + q3 + q4)*cos(q5)*sin(q1)), 0;
                                                                                                                                                     0, (d6*sin(q2 + q3 + q4 + q5))/2 - a4*sin(q2 + q3) - a3*sin(q2) - (d6*sin(q2 + q3 + q4 - q5))/2 - d5*sin(q2 + q3 + q4), (d6*sin(q2 + q3 + q4 + q5))/2 - a4*sin(q2 + q3) - (d6*sin(q2 + q3 + q4 - q5))/2 - d5*sin(q2 + q3 + q4), (d6*sin(q2 + q3 + q4 + q5))/2 - (d6*sin(q2 + q3 + q4 - q5))/2 - d5*sin(q2 + q3 + q4),  (d6*(sin(q2 + q3 + q4 + q5) + sin(q2 + q3 + q4 - q5)))/2, 0];